x11: Don't set up frame sync fence on unsupported compositors
authorRay Strode <rstrode@redhat.com>
Tue, 14 Jul 2020 13:40:34 +0000 (09:40 -0400)
committerRay Strode <rstrode@redhat.com>
Tue, 14 Jul 2020 18:33:12 +0000 (14:33 -0400)
Not all compositors support _NET_WM_FRAME_DRAWN.  In cases
where the compositor doesn't support _NET_WM_FRAME_DRAWN we don't
need to do all the fancy damage tracking and fence watching.

Furthermore, if the compositor doesn't support _NET_WM_FRAME_DRAWN,
it's possible that one frame will start before the previous frame has
made it through the pipeline, leading to a blown assertion.

This commit side-steps the unnecessary code and associated assertion
when _NET_WM_FRAME_DRAWN isn't supported.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/2927
gdk/x11/gdkglcontext-x11.c
gdk/x11/gdksurface-x11.c
gdk/x11/gdksurface-x11.h

index 9fdbca9c896882d88b039e37134eee593a4beec8..0bd475908f9d2bdbcdeac69ac6e2f6c0ed1037c6 100644 (file)
@@ -184,7 +184,7 @@ gdk_x11_gl_context_end_frame (GdkDrawContext *draw_context,
   gdk_x11_surface_pre_damage (surface);
 
 #ifdef HAVE_XDAMAGE
-  if (context_x11->xdamage != 0)
+  if (context_x11->xdamage != 0 && _gdk_x11_surface_syncs_frames (surface))
     {
       g_assert (context_x11->frame_fence == 0);
 
index 54bf26aae615731b4af0c052efc9488256874cd3..2567d7e765c606f6fc4135686492dbe165944bd4 100644 (file)
@@ -360,8 +360,8 @@ gdk_x11_surface_begin_frame (GdkSurface *surface,
     }
 }
 
-static gboolean
-should_sync_frame_drawing (GdkSurface *surface)
+gboolean
+_gdk_x11_surface_syncs_frames (GdkSurface *surface)
 {
   GdkX11Surface *impl = GDK_X11_SURFACE (surface);
 
@@ -395,7 +395,7 @@ static void
 maybe_sync_counter_for_end_frame (GdkSurface *surface)
 {
   GdkX11Surface *impl = GDK_X11_SURFACE (surface);
-  gboolean frame_sync_negotiated = should_sync_frame_drawing (surface);
+  gboolean frame_sync_negotiated = _gdk_x11_surface_syncs_frames (surface);
   gboolean frame_done_painting = !impl->toplevel->frame_pending;
 
 #ifdef HAVE_XDAMAGE
@@ -478,7 +478,7 @@ gdk_x11_surface_end_frame (GdkSurface *surface)
 
       maybe_sync_counter_for_end_frame (surface);
 
-      if (should_sync_frame_drawing (surface))
+      if (_gdk_x11_surface_syncs_frames (surface))
         {
           impl->toplevel->frame_pending = TRUE;
           gdk_surface_freeze_updates (surface);
index 5715c2f21d1f3f028e99d3e7db314fd6784a30b8..6fc7afd07d396d0f2547f7e26890c7b03035b9e9 100644 (file)
@@ -179,6 +179,7 @@ GdkCursor      *_gdk_x11_surface_get_cursor          (GdkSurface *window);
 void            _gdk_x11_surface_update_size         (GdkX11Surface *impl);
 void            _gdk_x11_surface_set_surface_scale   (GdkSurface *window,
                                                       int        scale);
+gboolean        _gdk_x11_surface_syncs_frames        (GdkSurface *surface);
 
 void            gdk_x11_surface_pre_damage           (GdkSurface *surface);
 
@@ -188,6 +189,7 @@ void            gdk_x11_surface_move                 (GdkSurface *surface,
 void            gdk_x11_surface_check_monitor        (GdkSurface *surface,
                                                       GdkMonitor *monitor);
 
+
 G_END_DECLS
 
 #endif /* __GDK_X11_SURFACE__ */